package com.zjsru.plan2024.oneday;

/**
 * 2917.找出数组中的 K-or 值
 * @Author: cookLee
 * @Date: 2024-03-06
 */
public class FindKOr {

    /**
     * 主
     * \
     * 只有在 nums 中，至少存在 k 个元素的第 i 位值为 1 ，那么 K-or 中的第 i 位的值才是 1 。
     * 对于整数 x ，如果 (2i AND x) == 2i ，则 x 中的第 i 位值为 1 ，其中 AND 为按位与运算符。
     * \
     * 输入：nums = [7,12,9,8,9,15], k = 4
     * 输出：9
     * 解释：nums[0]、nums[2]、nums[4] 和 nums[5] 的第 0 位的值为 1 。
     * nums[0] 和 nums[5] 的第 1 位的值为 1 。
     * nums[0]、nums[1] 和 nums[5] 的第 2 位的值为 1 。
     * nums[1]、nums[2]、nums[3]、nums[4] 和 nums[5] 的第 3 位的值为 1 。
     * 只有第 0 位和第 3 位满足数组中至少存在 k 个元素在对应位上的值为 1 。因此，答案为 2^0 + 2^3 = 9 。
     * \
     * 输入：nums = [2,12,1,11,4,5], k = 6
     * 输出：0
     * 解释：因为 k == 6 == nums.length ，所以数组的 6-or 等于其中所有元素按位与运算的结果。因此，答案为 2 AND 12 AND 1 AND 11 AND 4 AND 5 = 0 。
     * \
     * @param args args
     */
    public static void main(String[] args) {
        FindKOr findKOr = new FindKOr();
        int[] nums = new int[]{7, 12, 9, 8, 9, 15};
        int k = 4;
        System.out.println(findKOr.findKOr(nums, k));
    }

    /**
     * 找到kor
     *
     * @param nums nums
     * @param k    k
     * @return int
     */
    public int findKOr(int[] nums, int k) {
        int ans = 0;
        //按2进制运算
        for (int i = 0; i < 31; i++) {
            int cnt = 0;
            for (int num : nums) {
                //获取num 的第 i 位
                if (((num >> i) & 1) != 0) {
                    cnt++;
                }
            }
            //如果至少有 kkk 个 111，就将最终的答案加上 2^i
            if(cnt >= k){
                ans |= 1 << i;
            }
        }
        return ans;
    }


}
